import { Request, Response, NextFunction } from 'express';
import ApiResponse from '@/utils/api/api-response.util';
import { isEmpty } from '../common/validation.util';
import { getLogger } from '@/utils/logger';
import { AuthRequest } from '@/types';

const logger = getLogger('notice-validator', { console: false });
const consoleLogger = getLogger('notice-validator');

/**
 * 验证通知公告详情参数
 */
export const validateNoticeDetail = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { noticeId } = req.params;
    const id = Number(noticeId);
    
    if (!id || isNaN(id)) {
      consoleLogger.warn('获取公告详情参数无效', { noticeId });
      return ApiResponse.error(res, '参数错误：公告ID无效', 400);
    }
    
    logger.debug('通知公告详情参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`通知公告详情验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证通知公告创建参数
 */
export const validateNoticeCreate = async (req: AuthRequest, res: Response, next: NextFunction) => {
  try {
    const { noticeTitle, noticeType, noticeContent } = req.body;
    
    // 标题验证
    if (isEmpty(noticeTitle)) {
      return ApiResponse.error(res, '公告标题不能为空', 400);
    }
    
    // 类型验证
    if (isEmpty(noticeType)) {
      return ApiResponse.error(res, '公告类型不能为空', 400);
    }
    
    // 类型值验证
    if (!['1', '2'].includes(noticeType)) {
      return ApiResponse.error(res, '公告类型值无效，应为1(通知)或2(公告)', 400);
    }
    
    // 内容验证
    if (isEmpty(noticeContent)) {
      return ApiResponse.error(res, '公告内容不能为空', 400);
    }
    
    logger.debug('通知公告创建参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`通知公告创建验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证通知公告更新参数
 */
export const validateNoticeUpdate = async (req: AuthRequest, res: Response, next: NextFunction) => {
  try {
    const { noticeId, noticeTitle, noticeType, noticeContent } = req.body;
    
    // ID验证
    if (isEmpty(noticeId) || isNaN(parseInt(noticeId))) {
      return ApiResponse.error(res, '公告ID不能为空或无效', 400);
    }
    
    // 标题验证
    if (isEmpty(noticeTitle)) {
      return ApiResponse.error(res, '公告标题不能为空', 400);
    }
    
    // 类型验证
    if (isEmpty(noticeType)) {
      return ApiResponse.error(res, '公告类型不能为空', 400);
    }
    
    // 类型值验证
    if (!['1', '2'].includes(noticeType)) {
      return ApiResponse.error(res, '公告类型值无效，应为1(通知)或2(公告)', 400);
    }
    
    // 内容验证
    if (isEmpty(noticeContent)) {
      return ApiResponse.error(res, '公告内容不能为空', 400);
    }
    
    logger.debug('通知公告更新参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`通知公告更新验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证通知公告删除参数
 */
export const validateNoticeRemove = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { noticeIds } = req.params;
    
    if (isEmpty(noticeIds)) {
      return ApiResponse.error(res, '公告ID不能为空', 400);
    }
    
    const ids = noticeIds.split(',').map(id => parseInt(id));
    
    if (ids.some(id => isNaN(id))) {
      return ApiResponse.error(res, '公告ID格式无效', 400);
    }
    
    logger.debug('通知公告删除参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`通知公告删除验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
}; 